#ifndef GLOBAL_H
#define GLOBAL_H


#include <QWidget>
#include <functional>
#include <QRegularExpression>
#include "QStyle"
#include <QDebug>
#include <memory>
#include <iostream>
#include <mutex>
#include <QByteArray>
#include <QNetworkReply>
#include <QJsonObject>
#include <QDir>
#include <QSettings>
/**
 * @brief repolish
 * extern是一种“外部声明”的关键字，字面意思就是在此处声明某种变量或函数，在外部定义。
 * 用来刷新qss
 */
extern std::function<void(QWidget*)> repolish;


/**
 * @brief xorString
 * 异或操作（XOR，代表“exclusive or”）是一种逻辑运算，通常用于计算机科学和数字电路设计中。在二进制逻辑中，异或操作的规则如下：

输入为0和0时，输出为0
输入为0和1时，输出为1
输入为1和0时，输出为1
输入为1和1时，输出为0

用符号表示，异或操作通常用符号“⊕”表示。例如，对于两个二进制位A和B，异或的结果可以表示为A ⊕ B。
在编程中，许多语言（如C、C++、Java、Python等）使用符号“^”来表示异或操作。例如，如果有两个变量 a 和 b，你可以通过 a ^ b 来计算它们的异或值。
异或操作的一个重要特性是它具有可逆性，即：

A ⊕ B ⊕ B = A
这意味着如果你对A和B进行异或操作，再对结果与B进行异或，你将会得到A。这一特性使得异或在加密和数据完整性校验中非常有用。


 */
extern std::function<QString(QString)> xorString;

enum ReqId{
    ID_GET_VARIFY_CODE = 1001, //获取验证码
    ID_REG_USER = 1002, //注册用户
    ID_RESET_PWD = 1003, //重置密码
    ID_LOGIN_USER = 1004, //用户登录
    ID_CHAT_LOGIN = 1005, //登陆聊天服务器
    ID_CHAT_LOGIN_RSP= 1006, //登陆聊天服务器回包
    ID_SEARCH_USER_REQ = 1007, //搜索
};

enum Modules{
    REGISTERMOD = 0,
        RESETMOD = 1,
        LOGINMOD = 2,
};

enum ErrorCodes{
  SUCCESS = 0,
    ERR_JSON  = 1,//json解析失败
    ERR_NETWORK = 2,//网络错误
};
enum TipErr{
    TIP_SUCCESS = 0,
    TIP_EMAIL_ERR = 1,
    TIP_PWD_ERR = 2,
    TIP_CONFIRM_ERR = 3,
    TIP_PWD_CONFIRM = 4,
    TIP_VARIFY_ERR = 5,
    TIP_USER_ERR = 6
};
enum ClickLbState{
    Normal = 0,
    Selected = 1
};

// 添加的新的网络前缀
extern QString gate_url_prefix;

struct ServerInfo{
    QString Host;
    QString Port;
    QString Token;
    int Uid;
};

enum class ChatRole
{

    Self,
    Other
};

struct MsgInfo{
    QString msgFlag;//"text,image,file"
    QString content;//表示文件和图像的url,文本信息
    QPixmap pixmap;//文件和图片的缩略图
};

//聊天界面几种模式
enum ChatUIMode{
    SearchMode, //搜索模式
    ChatMode, //聊天模式
    ContactMode, //联系模式
};

//自定义QListWidgetItem的几种类型
enum ListItemType{
    CHAT_USER_ITEM, //聊天用户
    CONTACT_USER_ITEM, //联系人用户
    SEARCH_USER_ITEM, //搜索到的用户
    ADD_USER_TIP_ITEM, //提示添加用户
    INVALID_ITEM,  //不可点击条目
    GROUP_TIP_ITEM, //分组提示条目
    LINE_ITEM,  //分割线
    APPLY_FRIEND_ITEM, //好友申请
};

//申请好友标签输入框最低长度
const int MIN_APPLY_LABEL_ED_LEN = 40;

const QString add_prefix = "添加标签 ";

const int  tip_offset = 5;


const std::vector<QString>  strs ={"hello world !",
                             "nice to meet u",
                             "New year，new life",
                            "You have to love yourself",
                            "My love is written in the wind ever since the whole world is you"};

const std::vector<QString> heads = {
    ":/res/head_1.jpg",
    ":/res/head_2.jpg",
    ":/res/head_3.jpg",
    ":/res/head_4.jpg",
    ":/res/head_5.jpg"
};

const std::vector<QString> names = {
    "llfc",
    "zack",
    "golang",
    "cpp",
    "java",
    "nodejs",
    "python",
    "rust"
};

#endif // GLOBAL_H
